package ShapeModel;

import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;


/**
 * 用于绘制图形的基本类型，设计思路是其他类型首先继承现有的实现了Shape类的2D实体类，再实现这一接口，
 * 这样它们可以被draw函数绘画，也可以利用现有实体类实现好的一些方法，又可以实现CADShape中定义的一些应用于本程序的方法
 */
public interface CADShape extends Shape {
    void setZ(int z);

    int getZ();

    /**
     * 对line来说，返回创建时选择的顶点的x，对其他类型来说，返回左上角的顶点的x
     *
     * @return 指定顶点的x
     */
    double getX();

    /**
     * 对line来说，返回创建时选择的顶点的y，对其他类型来说，返回左上角的顶点的y
     *
     * @return 指定顶点的y
     */
    double getY();

    /**
     * 对line来说，返回创建时选择的顶点，对其他类型来说，返回左上角的顶点
     *
     * @return 返回指定顶点
     */
    default Point2D getPoint() {
        return new Point2D.Double(getX(), getY());
    }


    /**
     * 对line来说，参数是2个端点，对其他图形来说是左上和右下点
     */
    void setPos(Point2D p1, Point2D p2);

    /**
     * 提供两个点坐标的重置位置
     *
     * @param x1 第一点横坐标
     * @param y1 第一点纵坐标
     * @param x2 第二点横坐标
     * @param y2 第二点纵坐标
     */
    default void setPos(double x1, double y1, double x2, double y2) {
        setPos(new Point2D.Double(x1, y1), new Point2D.Double(x2, y2));
    }

    /**
     * 将图形进行移动的方法
     * @param dx 横向位移
     * @param dy 纵向位移
     */
    default void move(double dx, double dy) {
        Rectangle2D bound = getBounds2D();
        setPos(bound.getMinX() + dx, bound.getMinY() + dy, bound.getMaxX() + dx, bound.getMaxY() + dy);
    }

    /**
     * 修改图形形状的方法，四个参数分别是四个方向的修改量
     */
    default void resize(double dtop, double dbot, double dleft, double dright) {
        Rectangle2D bound = getBounds2D();
        setPos(bound.getMinX() + dleft, bound.getMinY() + dtop, bound.getMaxX() + dright, bound.getMaxY() + dbot);

    }

    void setColor(Color c);

    Color getColor();

    void setStrokeWidth(float width);

    float getStrokeWidth();

    /**
     * 对每一个图形，都对画笔颜色和粗细进行相应设置，之后再作画
     *
     * @param g2d 绘图指针
     */
    default void setDrawingConfig(Graphics2D g2d) {
        g2d.setColor(getColor());
        g2d.setStroke(new BasicStroke(getStrokeWidth()));
    }
}















